//package cn.flying.cloud.flow;
//
//import javax.annotation.Resource;
//import javax.validation.constraints.NotBlank;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Optional;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.core.io.InputStreamResource;
//import org.springframework.http.ResponseEntity;
//import org.springframework.stereotype.Controller;
//import org.springframework.ui.Model;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.PathVariable;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestMethod;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.ResponseBody;
//import org.springframework.web.multipart.MultipartFile;
//
//import cn.flying.cloud.base.common.constants.Constants;
//import cn.flying.cloud.base.common.utils.Ft;
//import cn.flying.cloud.base.common.vo.PageRequest;
//import cn.flying.cloud.base.common.vo.PageResponse;
//import cn.flying.cloud.base.common.vo.Rt;
//import cn.flying.cloud.base.common.vo.layui.XmSelect;
//import cn.flying.cloud.flow.context.FlowAuditForwardAbstract;
//import cn.flying.cloud.flow.context.FlowAuditForwardContext;
//import cn.flying.cloud.flow.entity.FwProcAttribute;
//import cn.flying.cloud.flow.entity.FwTaskCandidate;
//import cn.flying.cloud.flow.entity.FwTaskHis;
//import cn.flying.cloud.flow.feign.FlowManageFeignApi;
//import cn.flying.cloud.flow.model.FlowAuditVo;
//import cn.flying.cloud.flow.model.FlowStartVo;
//import cn.flying.cloud.flow.model.ProcDefinition;
//import cn.flying.cloud.flow.model.ProcHisInstance;
//import cn.flying.cloud.flow.model.ProcHisTask;
//import cn.flying.cloud.flow.model.ProcTask;
//import cn.flying.cloud.system.position.service.SysPostInfoService;
//import cn.flying.cloud.system.role.service.SysRoleInfoService;
//import cn.flying.cloud.system.user.service.SysUserInfoService;
//
///**
// * @author: admin
// * @date: 2024年11月24日 23:03
// * @version: 1.0
// */
//@Controller
//@RequestMapping("/flow")
//public class FlowController {
//    private final Logger logger = LoggerFactory.getLogger(this.getClass());
//
//    @Resource
//    private FlowManageFeignApi flowManageFeignApi;
//    @Resource
//    private SysUserInfoService sysUserInfoService;
//    @Resource
//    private SysRoleInfoService sysRoleInfoService;
//    @Resource
//    private SysPostInfoService sysPostInfoService;
//    @Resource
//    private FlowAuditForwardContext auditForwardContext;
//
//    /**
//     * 跳转到流程定义列表页面
//     *
//     * @return
//     */
//    @RequestMapping("definition/index")
//    public String turnDefList(Model model) {
//        Rt rt = flowManageFeignApi.getProcDefKeys();
//        model.addAttribute("procDefKeys", rt.getData());
//        return "flow/definition/index";
//    }
//
//    /**
//     * 加载流程定义列表数据
//     *
//     * @return
//     */
//    @RequestMapping(value = "definition/page", method = RequestMethod.POST)
//    @ResponseBody
//    public PageResponse<ProcDefinition> getProcessDefinitionPageList(PageRequest<ProcDefinition> request) {
//        PageResponse<ProcDefinition> pageResponse = flowManageFeignApi.getProcessDefinitionPageList(request);
//        return pageResponse;
//    }
//
//    /**
//     * 跳转到流程部署页面
//     *
//     * @return
//     */
//    @RequestMapping("definition/turn/deploy")
//    public String turnDeploy(Model model) {
//        return "flow/definition/deploy";
//    }
//
//    /**
//     * 新增部署流程定义
//     *
//     * @param file 流程定义文件
//     * @return
//     * @throws Exception
//     */
//    @PostMapping("definition/deploy")
//    @ResponseBody
//    public Rt deploy(@RequestParam("file") MultipartFile file) throws Exception {
//        return flowManageFeignApi.deploy(file);
//    }
//
//    /**
//     * 删除流程部署
//     *
//     * @param deploymentId
//     * @return
//     */
//    @RequestMapping(value = "definition/del/{deploymentId}", method = RequestMethod.POST)
//    @ResponseBody
//    public Rt del(@PathVariable("deploymentId") String deploymentId) {
//        return flowManageFeignApi.delete(deploymentId, true);
//    }
//
//    /**
//     * 挂起流程定义
//     *
//     * @param processDefId 流程定义ID
//     * @return
//     */
//    @PostMapping("definition/suspend")
//    @ResponseBody
//    public Rt suspend(@RequestParam("processDefId") String processDefId) {
//        return flowManageFeignApi.suspend(processDefId);
//    }
//
//    /**
//     * 激活流程定义
//     *
//     * @param processDefId 流程定义ID
//     * @return
//     */
//    @PostMapping("definition/active")
//    @ResponseBody
//    public Rt active(@RequestParam("processDefId") String processDefId) {
//        return flowManageFeignApi.active(processDefId);
//    }
//
//    /**
//     * 查看流程部署定义图
//     *
//     * @param processDefId 流程定义ID
//     * @throws Exception
//     */
//    @GetMapping("definition/process/diagram")
//    public ResponseEntity<byte[]> getProcessDiagram(@RequestParam("processDefId") String processDefId) {
//        return flowManageFeignApi.getProcessDiagram(processDefId);
//    }
////    void getProcessDiagram(HttpServletResponse response, @RequestParam("processDefId") String processDefId) {
////        byte[] bytes = flowFeignApi.getProcessDiagramByte(processDefId);
////        try (OutputStream out = response.getOutputStream(); ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) {
////            response.setContentType("image/png");
////            BufferedImage image = ImageIO.read(inputStream);
////            ImageIO.write(image, "png", out);
////        } catch (Exception e) {
////            logger.error("流程图生成失败", e);
////            throw new BizException(RtCodeEnum.R_ERROR.getCode(), "流程图生成失败！");
////        }
////    }
//
//    /**
//     * 下载流程xml文件
//     *
//     * @param processDefId 流程定义ID
//     * @throws Exception
//     */
//    @GetMapping("definition/process/xml")
//    public ResponseEntity<InputStreamResource> getProcessXml(@RequestParam("processDefId") String processDefId) {
//        return flowManageFeignApi.getProcessXml(processDefId);
//    }
//
//    /**
//     * 跳转到流程定义配置页面
//     *
//     * @return
//     */
//    @RequestMapping("definition/turn/config")
//    public String turnConfig(Model model, String processDefId) {
//        Rt allUserTask = flowManageFeignApi.getAllUserTask(processDefId);
//        model.addAttribute("allUserTask", allUserTask.getData());
//        List<XmSelect> userSelectList = sysUserInfoService.getUserSelectList();
//        model.addAttribute("users", userSelectList);
//        List<XmSelect> positionSelectList = sysPostInfoService.getPositionSelectList();
//        model.addAttribute("positions", positionSelectList);
//        List<XmSelect> roleSelectList = sysRoleInfoService.getRoleSelectList();
//        model.addAttribute("roles", roleSelectList);
//        model.addAttribute("processDefId", processDefId);
//        return "flow/definition/config";
//    }
//
//    /**
//     * 分页查询流程节点权限列表
//     *
//     * @param request
//     * @return
//     */
//    @PostMapping("definition/task/candidate/page")
//    @ResponseBody
//    public PageResponse taskCandidatePage(PageRequest<FwTaskCandidate> request) {
//        request.getParam().setTenantId((String) Ft.ThreadLocal.get(Constants.TENANT_ID));
//        PageResponse pageResponse = flowManageFeignApi.taskCandidatePage(request);
//        return pageResponse;
//    }
//
//    /**
//     * 跳转到流程节点权限编辑页面
//     *
//     * @return
//     */
//    @RequestMapping("definition/turn/candidate/edit")
//    public String turnCandidateEdit(Model model, String processDefId, Long id) {
//        Rt allUserTask = flowManageFeignApi.getAllUserTask(processDefId);
//        model.addAttribute("allUserTask", allUserTask.getData());
//        FwTaskCandidate candidate = new FwTaskCandidate();
//        candidate.setProcDefId(processDefId);
//        model.addAttribute("candidate", candidate);
//        if (id != null) {
//            Rt rt = flowManageFeignApi.taskCandidateGetById(id);
//            model.addAttribute("candidate", rt.getData());
//        }
//        return "flow/definition/candidate";
//    }
//
//    /**
//     * 保存流程节点权限
//     *
//     * @return
//     */
//    @RequestMapping("definition/candidate/save")
//    @ResponseBody
//    public Rt candidateSave(@RequestBody FwTaskCandidate fwTaskCandidate) {
//        fwTaskCandidate.setTenantId((String) Ft.ThreadLocal.get(Constants.TENANT_ID));
//        return flowManageFeignApi.taskCandidateSave(fwTaskCandidate);
//    }
//
//    /**
//     * 删除流程节点权限
//     *
//     * @return
//     */
//    @RequestMapping("definition/candidate/delete")
//    @ResponseBody
//    public Rt candidateSave(Long id) {
//        return flowManageFeignApi.taskCandidateDelete(id);
//    }
//
//    /**
//     * 分页查询流程配置列表
//     *
//     * @param request
//     * @return
//     */
//    @PostMapping("definition/proc/attribute/page")
//    @ResponseBody
//    public PageResponse procConfigPage(PageRequest<FwProcAttribute> request) {
//        request.getParam().setTenantId((String) Ft.ThreadLocal.get(Constants.TENANT_ID));
//        PageResponse pageResponse = flowManageFeignApi.procAttributePage(request);
//        return pageResponse;
//    }
//
//    /**
//     * 跳转到流程节点权限编辑页面
//     *
//     * @return
//     */
//    @RequestMapping("definition/turn/attribute/edit")
//    public String turnAttributeEdit(Model model, String processDefId, Long id) {
//        Rt allUserTask = flowManageFeignApi.getAllUserTask(processDefId);
//        model.addAttribute("allUserTask", allUserTask.getData());
//        Map<String, String> eventType = new HashMap<>();
//        eventType.put("start", "开始通知");
//        eventType.put("end", "结束通知");
////        eventType.put("", "");
//        model.addAttribute("eventType", eventType);
//        FwProcAttribute attribute = new FwProcAttribute();
//        attribute.setProcDefId(processDefId);
//        model.addAttribute("attribute", attribute);
//        if (id != null) {
//            Rt rt = flowManageFeignApi.procAttributeGetById(id);
//            model.addAttribute("attribute", rt.getData());
//        }
//        return "flow/definition/attribute";
//    }
//
//    /**
//     * 保存流程节点权限
//     *
//     * @return
//     */
//    @RequestMapping("definition/attribute/save")
//    @ResponseBody
//    public Rt attributeSave(@RequestBody FwProcAttribute attribute) {
//        attribute.setTenantId((String) Ft.ThreadLocal.get(Constants.TENANT_ID));
//        return flowManageFeignApi.procAttributeSave(attribute);
//    }
//
//    /**
//     * 删除流程节点权限
//     *
//     * @return
//     */
//    @RequestMapping("definition/attribute/delete")
//    @ResponseBody
//    public Rt attributeSave(Long id) {
//        return flowManageFeignApi.procAttributeDelete(id);
//    }
//
//
//    /**
//     * 启动流程
//     *
//     * @return
//     */
//    @RequestMapping("instance/start")
//    @ResponseBody
//    public Rt startProcess(@RequestBody FlowStartVo process) {
//        return flowManageFeignApi.startProcess(process);
//    }
//
//    /**
//     * 跳转到流程历史页面
//     *
//     * @return
//     */
//    @RequestMapping("history/index")
//    public String turnHisList(Model model) {
//        Rt rt = flowManageFeignApi.getProcDefKeys();
//        model.addAttribute("procDefKeys", rt.getData());
//        return "flow/history/index";
//    }
//
//    /**
//     * 分页查询流程实例历史列表
//     *
//     * @param request
//     * @return
//     */
//    @PostMapping("history/page")
//    @ResponseBody
//    public PageResponse<ProcHisInstance> getProcessHisInstPageList(PageRequest<ProcHisInstance> request) {
//        PageResponse<ProcHisInstance> pageResponse = flowManageFeignApi.getProcessHisInstPageList(request);
//        List<ProcHisInstance> data = pageResponse.getData();
//        List<XmSelect> list = sysUserInfoService.getUserSelectList();
//        data.forEach(d -> {
//            if (Ft.String.isNotBlank(d.getStartUserId())) {
//                Optional<XmSelect> any = list.stream().filter(u -> d.getStartUserId().equals(u.getValue())).findAny();
//                any.ifPresent(xmSelect -> d.setStartUserId(d.getStartUserId() + "/" + xmSelect.getName()));
//            }
//            if (Ft.String.isNotBlank(d.getAssignee())) {
//                String[] split = d.getAssignee().split(",");
//                List<String> assignees = new ArrayList<>();
//                for (String a : split) {
//                    Optional<XmSelect> any = list.stream().filter(u -> a.equals(u.getValue())).findAny();
//                    any.ifPresent(xmSelect -> {
//                        assignees.add(xmSelect.getName());
//                    });
//                }
//                d.setAssignee(String.join("，", assignees));
//            }
//        });
//        return pageResponse;
//    }
//
//    /**
//     * 跳转到流程实例页面
//     *
//     * @return
//     */
//    @RequestMapping("instance/index")
//    public String turnInstList(Model model) {
//        Rt rt = flowManageFeignApi.getProcDefKeys();
//        model.addAttribute("procDefKeys", rt.getData());
//        return "flow/instance/index";
//    }
//
//    /**
//     * 分页查询我发起的流程实例历史列表
//     *
//     * @return
//     */
//    @RequestMapping(value = "instance/start/his/page", method = RequestMethod.POST)
//    @ResponseBody
//    public PageResponse<ProcHisInstance> getStartProcessInstPageList(PageRequest<ProcHisInstance> request) {
//        String userName = (String) Ft.ThreadLocal.get(Constants.USER_NAME);
//        request.getParam().setStartUserId(userName);
//        PageResponse<ProcHisInstance> pageResponse = flowManageFeignApi.getStartProcessInstPageList(request);
//        List<ProcHisInstance> data = pageResponse.getData();
//        List<XmSelect> list = sysUserInfoService.getUserSelectList();
//        data.forEach(d -> {
//            if (Ft.String.isNotBlank(d.getAssignee())) {
//                String[] split = d.getAssignee().split(",");
//                List<String> assignees = new ArrayList<>();
//                for (String a : split) {
//                    Optional<XmSelect> any = list.stream().filter(u -> a.equals(u.getValue())).findAny();
//                    any.ifPresent(xmSelect -> {
//                        assignees.add(xmSelect.getName());
//                    });
//                }
//                d.setAssignee(String.join("，", assignees));
//            }
//        });
//        return pageResponse;
//    }
//
//    /**
//     * 流程撤回
//     *
//     * @param procInstId 流程实例ID
//     * @return
//     */
//    @PostMapping("instance/cancel")
//    @ResponseBody
//    public Rt cancelProcess(@NotBlank(message = "流程实例ID不能为空") @RequestParam String procInstId) {
//        return flowManageFeignApi.cancelProcess(procInstId);
//    }
//
//    /**
//     * 流程作废（删除实例）
//     *
//     * @param procInstId 流程实例ID
//     * @param reason     原因备注
//     * @return
//     */
//    @PostMapping("instance/delete")
//    @ResponseBody
//    public Rt deleteProcess(@NotBlank(message = "流程实例ID不能为空") @RequestParam String procInstId, @RequestParam String reason) {
//        return flowManageFeignApi.deleteProcess(procInstId, reason);
//    }
//
//    /**
//     * 跳转到流程详情页面
//     *
//     * @return
//     */
//    @RequestMapping("instance/turn/detail")
//    public String turnInstDetail(Model model, String processInstId) {
//        model.addAttribute("processInstId", processInstId);
//        return "flow/instance/detail";
//    }
//
//    /**
//     * 委派任务
//     *
//     * @param taskId   任务ID
//     * @param assignee 代理人
//     */
//    @PostMapping("instance/task/delegate")
//    @ResponseBody
//    public Rt delegateTask(@NotBlank(message = "任务ID不能为空") @RequestParam String taskId, @NotBlank(message = "代理人不能为空") @RequestParam String assignee) {
//        return flowManageFeignApi.delegateTask(taskId, assignee);
//    }
//
//    /**
//     * 指派任务
//     *
//     * @param taskId   任务ID
//     * @param assignee 代理人
//     */
//    @PostMapping("instance/task/assign")
//    @ResponseBody
//    public Rt assignTask(@NotBlank(message = "任务ID不能为空") @RequestParam String taskId, @NotBlank(message = "代理人不能为空") @RequestParam String assignee) {
//        return flowManageFeignApi.assignTask(taskId, assignee);
//    }
//
//    /**
//     * 跳转到我的待办页面
//     *
//     * @return
//     */
//    @RequestMapping("task/incomplete/index")
//    public String turnTaskIncompleteList(Model model) {
//        Rt rt = flowManageFeignApi.getProcDefKeys();
//        model.addAttribute("procDefKeys", rt.getData());
//        return "flow/task/incomplete/index";
//    }
//
//    /**
//     * 查询我的待办任务
//     *
//     * @param request
//     * @return
//     */
//    @PostMapping("instance/task/incomplete")
//    @ResponseBody
//    public PageResponse incompleteTasks(PageRequest<ProcTask> request) {
//        String tenantId = (String) Ft.ThreadLocal.get(Constants.TENANT_ID);
//        String userName = (String) Ft.ThreadLocal.get(Constants.USER_NAME);
//        request.getParam().setTenantId(tenantId);
//        request.getParam().setAssignee(userName);
//        PageResponse<ProcTask> pageResponse = flowManageFeignApi.incompleteTasks(request);
//        List<ProcTask> data = pageResponse.getData();
//        List<XmSelect> list = sysUserInfoService.getUserSelectList();
//        data.forEach(d -> {
//            if (Ft.String.isNotBlank(d.getStartUserId())) {
//                Optional<XmSelect> any = list.stream().filter(u -> d.getStartUserId().equals(u.getValue())).findAny();
//                any.ifPresent(xmSelect -> d.setStartUserId(xmSelect.getName()));
//            }
//        });
//        return pageResponse;
//    }
//
//    /**
//     * 跳转到对应流程的审批页面
//     *
//     * @return
//     */
//    @RequestMapping("instance/task/audit/list")
//    public String turnTaskAuditList(@RequestParam String procDefKey, @RequestParam String procInstId, @RequestParam String formKey, Model model) {
//        // 目前想法是通过formKey来区分跳转到不同的页面
//        FlowAuditForwardAbstract bean = auditForwardContext.getBean(procDefKey);
//        if (bean == null) {
//            // 没找到返回404页面
//            return "error/404";
//        }
//        try {
//            String path = bean.turnAudit(procInstId, formKey, model);
//            logger.info("审批跳转路径：【{}】", path);
//            return path;
//        } catch (Exception e) {
//            logger.error("转发异常---->", e);
//            // 系统异常返回5xx页面
//            return "error/5xx";
//        }
//    }
//
//    /**
//     * 完成提交任务
//     *
//     * @param auditVo
//     * @return
//     */
//    @PostMapping("instance/task/complete")
//    @ResponseBody
//    public Rt completeTask(@RequestBody FlowAuditVo auditVo) {
//        return flowManageFeignApi.completeTask(auditVo);
//    }
//
//    /**
//     * 跳转到我的已办页面
//     *
//     * @return
//     */
//    @RequestMapping("task/completed/index")
//    public String turnTaskCompleteList(Model model) {
//        Rt rt = flowManageFeignApi.getProcDefKeys();
//        model.addAttribute("procDefKeys", rt.getData());
//        return "flow/task/completed/index";
//    }
//
//    /**
//     * 查询我的已办任务
//     *
//     * @param request
//     * @return
//     */
//    @PostMapping("instance/task/completed/his")
//    @ResponseBody
//    public PageResponse completedHisTasks(PageRequest<ProcHisTask> request) {
//        String tenantId = (String) Ft.ThreadLocal.get(Constants.TENANT_ID);
//        request.getParam().setTenantId(tenantId);
//        request.getParam().setAssignee((String) Ft.ThreadLocal.get(Constants.USER_NAME));
//        PageResponse<ProcHisTask> pageResponse = flowManageFeignApi.completedHisTasks(request);
//        List<ProcHisTask> data = pageResponse.getData();
//        List<XmSelect> list = sysUserInfoService.getUserSelectList();
//        data.forEach(d -> {
//            if (Ft.String.isNotBlank(d.getStartUserId())) {
//                Optional<XmSelect> any = list.stream().filter(u -> d.getStartUserId().equals(u.getValue())).findAny();
//                any.ifPresent(xmSelect -> d.setStartUserId(d.getStartUserId() + "/" + xmSelect.getName()));
//            }
//        });
//        return pageResponse;
//    }
//
//    /**
//     * 触发任务（针对Receive Task）
//     *
//     * @param processInstId 流程实例
//     * @param taskId        任务ID
//     */
//    @PostMapping("instance/task/trigger")
//    @ResponseBody
//    public Rt triggerTask(@NotBlank(message = "流程实例ID不能为空") @RequestParam String processInstId, @NotBlank(message = "任务ID不能为空") @RequestParam String taskId) {
//        return flowManageFeignApi.triggerTask(processInstId, taskId);
//    }
//
//    /**
//     * 查询我已完成的历史任务
//     *
//     * @param request
//     * @return
//     */
//    @PostMapping("task/his/page")
//    @ResponseBody
//    public PageResponse<FwTaskHis> TaskHis(PageRequest<FwTaskHis> request) {
//        request.getParam().setUserId((String) Ft.ThreadLocal.get(Constants.USER_NAME));
//        request.getParam().setTenantId((String) Ft.ThreadLocal.get(Constants.TENANT_ID));
//        return flowManageFeignApi.taskHisPage(request);
//    }
//
//    /**
//     * 查询流程活动流转信息
//     *
//     * @param processInstId
//     * @return
//     */
//    @PostMapping("task/his/list")
//    @ResponseBody
//    public Rt getProcTaskHis(@NotBlank(message = "流程实例ID不能为空") @RequestParam String processInstId) {
//        FwTaskHis his = new FwTaskHis();
//        his.setProcInstId(processInstId);
//        return flowManageFeignApi.taskHisList(his);
//    }
//
//    /**
//     * 跳转到待领取任务页面
//     *
//     * @return
//     */
//    @RequestMapping("task/unassigned/index")
//    public String turnTaskUnassignedList(Model model) {
//        Rt rt = flowManageFeignApi.getProcDefKeys();
//        model.addAttribute("procDefKeys", rt.getData());
//        return "flow/task/unassigned/index";
//    }
//
//    /**
//     * 跳转到流程任务详情页面
//     *
//     * @return
//     */
//    @RequestMapping("instance/task/turn/detail")
//    public String turnInstTaskDetail(Model model, String processInstId) {
//        model.addAttribute("processInstId", processInstId);
//        return "flow/task/unassigned/detail";
//    }
//
//    /**
//     * 查询未分配代理人的任务（未领取）
//     *
//     * @param request
//     * @return
//     */
//    @PostMapping("instance/task/unassigned")
//    @ResponseBody
//    public PageResponse unassignedTasks(PageRequest<ProcTask> request) {
//        String tenantId = (String) Ft.ThreadLocal.get(Constants.TENANT_ID);
//        request.getParam().setTenantId(tenantId);
//        return flowManageFeignApi.unassignedTasks(request);
//    }
//
//    /**
//     * 领取任务
//     *
//     * @param taskId 任务ID
//     */
//    @PostMapping("instance/task/claim")
//    @ResponseBody
//    public Rt claim(@NotBlank(message = "任务ID不能为空") @RequestParam String taskId) {
//        String assignee = (String) Ft.ThreadLocal.get(Constants.USER_NAME);
//        return flowManageFeignApi.claim(taskId, assignee);
//    }
//
//    /**
//     * 归还领取的任务
//     *
//     * @param taskId   任务ID
//     * @param assignee 代理人
//     */
//    @PostMapping("instance/task/unclaim")
//    @ResponseBody
//    public Rt unclaim(@NotBlank(message = "任务ID不能为空") @RequestParam String taskId, @NotBlank(message = "代理人不能为空") @RequestParam String assignee) {
//        return flowManageFeignApi.unclaim(taskId, assignee);
//    }
//
//    /**
//     * 查看流程实例进度图片
//     *
//     * @param processInstId 流程实例ID
//     * @throws Exception 异常
//     */
//    @GetMapping("instance/process/image")
//    public ResponseEntity<byte[]> getProcessImage(@RequestParam String processInstId) {
//        return flowManageFeignApi.getProcessImage(processInstId);
//    }
//}
